/**
 * Summary: interfaces to the Catalog handling system
 * Description: the catalog module implements the support for
 * XML Catalogs and SGML catalogs
 *
 * SGML Open Technical Resolution TR9401:1997.
 * http://www.jclark.com/sp/catalog.htm
 *
 * XML Catalogs Working Draft 06 August 2001
 * http://www.oasis-open.org/committees/entity/spec-2001-08-06.html
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __XML_CATALOG_H__
#define __XML_CATALOG_H__

#include <stdio.h>

#include <libxml/xmlversion.h>
#include <libxml/xmlstring.h>
#include <libxml/tree.h>

#ifdef LIBXML_CATALOG_ENABLED

#ifdef __cplusplus
extern "C" {
#endif

/**
 * XML_CATALOGS_NAMESPACE:
 *
 * The namespace for the XML Catalogs elements.
 */
#define XML_CATALOGS_NAMESPACE                    \
    (const xmlChar *) "urn:oasis:names:tc:entity:xmlns:xml:catalog"
/**
 * XML_CATALOG_PI:
 *
 * The specific XML Catalog Processing Instuction name.
 */
#define XML_CATALOG_PI                        \
    (const xmlChar *) "oasis-xml-catalog"

/*
 * The API is voluntarily limited to general cataloging.
 */
typedef enum {
    XML_CATA_PREFER_NONE = 0,
    XML_CATA_PREFER_PUBLIC = 1,
    XML_CATA_PREFER_SYSTEM
} xmlCatalogPrefer;

typedef enum {
    XML_CATA_ALLOW_NONE = 0,
    XML_CATA_ALLOW_GLOBAL = 1,
    XML_CATA_ALLOW_DOCUMENT = 2,
    XML_CATA_ALLOW_ALL = 3
} xmlCatalogAllow;

typedef struct _xmlCatalog xmlCatalog;
typedef xmlCatalog *xmlCatalogPtr;

/*
 * Operations on a given catalog.
 */
XMLPUBFUN xmlCatalogPtr XMLCALL
        xmlNewCatalog        (int sgml);
XMLPUBFUN xmlCatalogPtr XMLCALL    
        xmlLoadACatalog        (const char *filename);
XMLPUBFUN xmlCatalogPtr XMLCALL    
        xmlLoadSGMLSuperCatalog    (const char *filename);
XMLPUBFUN int XMLCALL        
        xmlConvertSGMLCatalog    (xmlCatalogPtr catal);
XMLPUBFUN int XMLCALL        
        xmlACatalogAdd        (xmlCatalogPtr catal,
                     const xmlChar *type,
                     const xmlChar *orig,
                     const xmlChar *replace);
XMLPUBFUN int XMLCALL        
        xmlACatalogRemove    (xmlCatalogPtr catal,
                     const xmlChar *value);
XMLPUBFUN xmlChar * XMLCALL    
        xmlACatalogResolve    (xmlCatalogPtr catal,
                     const xmlChar *pubID,
                                     const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlACatalogResolveSystem(xmlCatalogPtr catal,
                     const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlACatalogResolvePublic(xmlCatalogPtr catal,
                     const xmlChar *pubID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlACatalogResolveURI    (xmlCatalogPtr catal,
                     const xmlChar *URI);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL        
        xmlACatalogDump        (xmlCatalogPtr catal,
                     FILE *out);
#endif /* LIBXML_OUTPUT_ENABLED */
XMLPUBFUN void XMLCALL        
        xmlFreeCatalog        (xmlCatalogPtr catal);
XMLPUBFUN int XMLCALL        
        xmlCatalogIsEmpty    (xmlCatalogPtr catal);

/*
 * Global operations.
 */
XMLPUBFUN void XMLCALL        
        xmlInitializeCatalog    (void);
XMLPUBFUN int XMLCALL        
        xmlLoadCatalog        (const char *filename);
XMLPUBFUN void XMLCALL        
        xmlLoadCatalogs        (const char *paths);
XMLPUBFUN void XMLCALL        
        xmlCatalogCleanup    (void);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL        
        xmlCatalogDump        (FILE *out);
#endif /* LIBXML_OUTPUT_ENABLED */
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogResolve    (const xmlChar *pubID,
                                     const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogResolveSystem    (const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogResolvePublic    (const xmlChar *pubID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogResolveURI    (const xmlChar *URI);
XMLPUBFUN int XMLCALL        
        xmlCatalogAdd        (const xmlChar *type,
                     const xmlChar *orig,
                     const xmlChar *replace);
XMLPUBFUN int XMLCALL        
        xmlCatalogRemove    (const xmlChar *value);
XMLPUBFUN xmlDocPtr XMLCALL    
        xmlParseCatalogFile    (const char *filename);
XMLPUBFUN int XMLCALL        
        xmlCatalogConvert    (void);

/*
 * Strictly minimal interfaces for per-document catalogs used
 * by the parser.
 */
XMLPUBFUN void XMLCALL        
        xmlCatalogFreeLocal    (void *catalogs);
XMLPUBFUN void * XMLCALL        
        xmlCatalogAddLocal    (void *catalogs,
                     const xmlChar *URL);
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogLocalResolve    (void *catalogs,
                     const xmlChar *pubID,
                                     const xmlChar *sysID);
XMLPUBFUN xmlChar * XMLCALL    
        xmlCatalogLocalResolveURI(void *catalogs,
                     const xmlChar *URI);
/*
 * Preference settings.
 */
XMLPUBFUN int XMLCALL        
        xmlCatalogSetDebug    (int level);
XMLPUBFUN xmlCatalogPrefer XMLCALL 
        xmlCatalogSetDefaultPrefer(xmlCatalogPrefer prefer);
XMLPUBFUN void XMLCALL        
        xmlCatalogSetDefaults    (xmlCatalogAllow allow);
XMLPUBFUN xmlCatalogAllow XMLCALL    
        xmlCatalogGetDefaults    (void);


/* DEPRECATED interfaces */
XMLPUBFUN const xmlChar * XMLCALL    
        xmlCatalogGetSystem    (const xmlChar *sysID);
XMLPUBFUN const xmlChar * XMLCALL    
        xmlCatalogGetPublic    (const xmlChar *pubID);

#ifdef __cplusplus
}
#endif
#endif /* LIBXML_CATALOG_ENABLED */
#endif /* __XML_CATALOG_H__ */
